home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_oth / mini4th / mini.a86 next >
Text File  |  1988-08-08  |  22KB  |  1,213 lines

  1. ; MINIFORTH  - Copyright 1988 by Ted Beach
  2. ;                                5112 Williamsburg Blvd.
  3. ;                                Arlington VA, 22207
  4. ;                 703-237-0295
  5.  
  6. ; This is a VERY minimum version of FORTH that has several innovations -
  7. ; First, mini makes extensive use of TO variables, particularly as USER
  8. ; variables : BASE, >IN, COMPILING (STATE), S0, R0, BLK, BLOCK, etc.
  9. ; Second, there is incorporated a mechanism whereby conditionals (IF, THEN
  10. ; ELSE, BEGIN, UNTIL, etc.) can be executed directly from the keyboard with-
  11. ; out having to create a word (sometimes a dummy word) to compile them in.
  12. ; Simply key in the words as needed, then add a semicolon. The structure 
  13. ; will execute at HERE then be discarded. Should you ever make an error while
  14. ; compiling from the keyboard, your mistake will be automatically erased --
  15. ; you won't find the dictionary garbaged up with a partially compiled word.
  16. ; Source code MUST BE ASSEMBLED WITH A86 - make needed changes if you
  17. ; want to use MASM (ugh!).
  18. ; The file named MINI.MIN has certain needed structures. You will have to
  19. ; enter these from the keyboard. In order to save the extended version, run
  20. ; mini under DEBUG. Then, just before leaving mini, enter "HERE  .H"
  21. ; Note the number printed, type "BYE", then from DEBUG change CX to the number
  22. ; printed. Use DEBUG's W command to Write the program to disk.
  23.  
  24. ;          ***************** NOTE ******************* 
  25.  
  26. ; You are free to use this copyrighted material for your own personal
  27. ; needs. Commercial use is prohibited without the consent of the copyright
  28. ; holder. Contact the author at the address above for additional information.
  29. ; There is already available version 1.5 which adds a second (short) machine
  30. ; stack to help certain operations. Tutorial material is available on learning
  31. ; how to use miniforth. For those used to FORTH, this listing and the MINI.MIN
  32. ; file should provide adequate information on how to extend miniforth.
  33.  
  34. ;         *******************************************
  35.  
  36. HEAD    MACRO
  37.     DW LINK
  38.     LINK=$-2
  39.     DB #1+080
  40.     DB #2
  41. #EM
  42.  
  43. HEADI    MACRO
  44.     DW LINK
  45.     LINK=$-2
  46.     DB #1+0C0
  47.     DB #2
  48. #EM
  49.  
  50. COLON    MACRO
  51.     CALL DOCOLON
  52. #EM
  53. NEXT    MACRO
  54.     LODSW
  55.     JMP AX
  56. #EM
  57.  
  58. VARI    MACRO
  59.     JMP DOVAR
  60. #EM
  61.  
  62. CONST    MACRO
  63.     JMP DOCON
  64. #EM
  65.  
  66. TOVAR    MACRO
  67.     JMP DOTOVAR
  68. #EM
  69.  
  70. VOCAB    MACRO
  71.     JMP DOVOC
  72. #EM
  73.  
  74. X    MACRO
  75.     XCHG SP,BP
  76. #EM
  77.  
  78. ORG    0100
  79.     JMP INIT
  80.  
  81. ; STORAGE LOCATIONS FOR USER VARIABLES
  82.  
  83. CHERE    DW DP
  84. CTOIN    DW 0
  85. CBLOCK    DW 0
  86. CBASE    DW 10
  87. CBLK    DW 0
  88. CSPAN    DW 0
  89. CCOMP    DW 0
  90. CTDP    DW ABORT-6
  91. CS0    DW -256
  92. CR0    DW 0
  93. CDBL    DW 0
  94.  
  95. TFL    DW 0
  96. CSP    DW 0
  97.  
  98. BUF:    DB 80        ; TIB FOR KEYBOARD
  99. CNT    DB 81 DUP (0)
  100.  
  101. ; HEADERLESS EXECUTION CODE GOES HERE
  102.  
  103. DOCOLON:
  104.     X
  105.     PUSH SI
  106.     X
  107.     POP SI
  108.     NEXT
  109. DOTOVAR:
  110.     PUSH BX
  111.     ADD AX,3
  112.     MOV BX,AX
  113.     MOV BX,[BX]
  114.     MOV CX,TFL
  115.     JCXZ FETCH
  116.     OR CX,CX
  117.     MOV W TFL,0
  118.     JNS XSTORE
  119. XPSTORE:
  120.     POP AX
  121.     ADD [BX],AX
  122.     POP BX
  123.     NEXT
  124. XSTORE:
  125.     POP AX
  126.     MOV [BX],AX
  127.     POP BX
  128.     NEXT
  129. DOCON:
  130.     PUSH BX
  131.     ADD AX,3
  132.     MOV BX,AX
  133. FETCH:
  134.     MOV BX,[BX]
  135.     NEXT
  136. DOVAR:
  137.     PUSH BX
  138.     ADD AX,3
  139.     MOV BX,AX
  140.     NEXT
  141. DOVOC:
  142.     ADD AX,3
  143.     MOV W CONT,AX
  144.     NEXT
  145. XEXEC:    MOV AX,BX
  146.     POP BX
  147.     JMP AX
  148. XEXIT:
  149.     X
  150.     POP SI
  151.     X
  152.     NEXT
  153. XTOR:    X
  154.     PUSH BX
  155.     X
  156.     POP BX
  157.     NEXT
  158. XRFR:    PUSH BX
  159.     X
  160.     POP BX
  161.     X
  162.     NEXT
  163. XTOR2:    POP AX
  164.     X
  165.     PUSH BX,AX
  166.     X
  167.     POP BX
  168.     NEXT
  169. XRFR2:    PUSH BX
  170.     X
  171.     POP AX,BX
  172.     X
  173.     PUSH AX
  174.     NEXT
  175. XTO:    INC W TFL
  176.     NEXT
  177. XPTO:    DEC W TFL
  178.     NEXT
  179. XDUP:    PUSH BX
  180.     NEXT
  181. XQDUP:    OR BX,BX
  182.     JNZ XDUP
  183.     NEXT
  184. XDROP:    POP BX
  185.     NEXT
  186. XSWAP:    POP AX
  187.     PUSH BX
  188.     MOV BX,AX
  189.     NEXT
  190. XOVER:    POP AX
  191.     PUSH AX,BX
  192.     MOV BX,AX
  193.     NEXT
  194. XROT:    POP CX,DX
  195.     PUSH CX,BX
  196.     MOV BX,DX
  197.     NEXT
  198. XCAT:    MOV BL,[BX]
  199.     MOV BH,0
  200.     NEXT
  201. XCSTORE:POP AX
  202.     MOV [BX],AL
  203.     POP BX
  204.     NEXT
  205. XDUP2:    PUSH BX
  206.     MOV DI,SP
  207.     PUSH [DI+2]
  208.     NEXT
  209. XDROP2:    POP BX,BX
  210.     NEXT
  211. XSWAP2: POP AX,CX,DX
  212.     PUSH AX,BX,DX
  213.     MOV BX,CX
  214.     NEXT
  215. XPLUS:    POP AX
  216.     ADD BX,AX
  217.     NEXT
  218. XSUBT:    POP AX
  219.     NEG BX
  220.     ADD BX,AX
  221.     NEXT
  222. XZEQ:    XOR AX,AX
  223.     OR BX,BX
  224.     JNZ X1
  225. X2:    DEC AX
  226. X1:    XCHG AX,BX
  227.     NEXT
  228. XZLESS:    XOR AX,AX
  229.     OR BX,BX
  230.     JNS X1
  231.     JS X2
  232. XZGRT:    XOR AX,AX
  233.     OR BX,BX
  234.     JZ X1
  235.     JS X1
  236.     JMP X2
  237. XZNE:    MOV AX,-1
  238.     OR BX,BX
  239.     JZ >L0
  240.     MOV BX,AX
  241. L0:    NEXT
  242. XPLOOP:    X
  243.     POP AX,CX
  244.     INC AX
  245.     INC CX
  246.     JO EXLP
  247. L1:    PUSH CX,AX
  248.     X
  249. XBRAN:    MOV SI,[SI]
  250.     NEXT
  251. XPPLOOP:
  252.     POP DI
  253.     X
  254.     POP AX,CX
  255.     ADD AX,BX
  256.     ADD CX,BX
  257.     MOV BX,DI
  258.     JNO L1
  259. EXLP:    X
  260. L3:    ADD SI,2
  261.     NEXT
  262. XZBRAN:    OR BX,BX
  263.     POP BX
  264.     JZ XBRAN
  265.     JNZ L3
  266. XI:
  267. XRAT:    PUSH BX
  268.     X
  269.     POP BX
  270.     PUSH BX
  271.     X
  272.     NEXT
  273. XOF:    POP AX
  274.     CMP AX,BX
  275.     JZ >L1
  276.     MOV BX,AX
  277.     JMP XBRAN
  278. L1:    POP BX
  279.     ADD SI,2
  280.     NEXT
  281. XOVER2:    POP AX,CX,DX
  282.     PUSH DX,CX,AX,BX,DX
  283.     MOV BX,CX
  284.     NEXT
  285. XONEPL:    INC BX
  286.     NEXT
  287. XTWOPL:    ADD BX,2
  288.     NEXT
  289. XTHREEPL:
  290.     ADD BX,3
  291.     NEXT
  292. XONEMI:    DEC BX
  293.     NEXT
  294. XTWOMI:    SUB BX,2
  295.     NEXT
  296. XTHREEMI:SUB BX,3
  297.     NEXT
  298. XTWOSLS:SAR BX,1
  299.     NEXT
  300. XTWOSTAR:
  301.     SHL BX,1
  302.     NEXT
  303. XUMSTAR:POP AX
  304.     MUL BX
  305.     PUSH AX
  306.     MOV BX,DX
  307.     NEXT
  308. XUMSLSM:POP DX
  309.     XOR AX,AX
  310.     CMP DX,BX
  311.     JNB >L0
  312.     POP AX
  313.     DIV BX
  314.     PUSH DX
  315. L0:    MOV BX,AX
  316.     NEXT
  317. XDPLUS:    POP AX,CX,DX
  318.     ADD DX,AX
  319.     PUSH DX
  320.     ADC BX,CX
  321.     NEXT
  322. XDNEGATE:POP AX
  323.     NEG AX
  324.     PUSH AX
  325.     XCHG AX,BX
  326.     MOV BX,0
  327.     SBB BX,AX
  328.     NEXT
  329. XNEGATE:NEG BX
  330.     NEXT
  331. XAND:    POP AX
  332.     AND BX,AX
  333.     NEXT
  334. XORE:    POP AX
  335.     OR BX,AX
  336.     NEXT
  337. XXORX:    POP AX
  338.     XOR BX,AX
  339.     NEXT
  340. XLIT:    PUSH BX
  341.     LODSW
  342.     MOV BX,AX
  343.     NEXT
  344. XULESS:    POP AX
  345.     SUB AX,BX
  346.     MOV BX,-1
  347.     JB >L0
  348.     INC BX
  349. L0:    NEXT
  350. XLESS:    POP AX
  351.     SUB AX,BX
  352.     MOV BX,-1
  353.     JL  >L0
  354.     INC BX
  355. L0:    NEXT
  356. XTWOAT:    PUSH [BX+2]
  357.     MOV BX,[BX]
  358.     NEXT
  359. XTWOSTORE:POP [BX]
  360.     POP [BX+2]
  361.     POP BX
  362.     NEXT
  363. XPICK:    SHL BX,1
  364.     ADD BX,SP
  365.     MOV BX,[BX]
  366.     NEXT
  367. XEQUAL:    POP AX
  368.     CMP BX,AX
  369.     MOV BX,-1
  370.     JZ >L0
  371.     INC BX
  372. L0:    NEXT
  373. XCR:    MOV DL,0D
  374.     MOV AH,2
  375.     INT 021
  376.     MOV DL,0A
  377.     INT 021
  378.     NEXT
  379. XQKEY:    PUSH BX
  380.     MOV AH,0B
  381.     INT 021
  382.     CBW
  383.     MOV BX,AX
  384.     NEXT
  385. XKEY:    PUSH BX
  386.     MOV AH,7
  387.     INT 021
  388.     XOR AH,AH
  389.     MOV BX,AX
  390.     NEXT
  391. XEMIT:    MOV DL,BL
  392.     MOV AH,2
  393.     INT 021
  394.     POP BX
  395.     NEXT
  396. XTYPE:    POP DX
  397.     MOV CX,BX
  398.     JCXZ >L0
  399.     MOV AH,040
  400.     MOV BX,1
  401.     INT 021
  402. L0:    POP BX
  403.     NEXT
  404.  
  405. LINK=0
  406.     ; START OF MINIFORTH WITH ITS HEADERS
  407. MINE:    DW LINK
  408.     DB 0E4,'MINI'    ; BIT 6 SET FOR IMMEDIATE, BIT 5 FOR VOCABULARY
  409. MINI:    VOCAB   
  410. RUTE:    DW LAST        ; HOLDER FOR LAST
  411.     DW MINE        ; VOCABULARY STOPPER
  412. LINK=$-2        ; WORDS LINK INTO ROOT VOCABULARY, 'MINI'.
  413.     HEAD 4,'EXIT'    ; ( 0/0)
  414. EXIT:    JMP XEXIT
  415.     HEAD 1,'!'    ; (2/0)
  416. STORE:    JMP XSTORE    
  417.     HEAD 2,'+!'    ; (2/0)
  418. PSTOR:    JMP XPSTORE
  419.     HEAD 1,'@'    ; (1/1)
  420. ATT:    JMP FETCH
  421.     HEAD 2,'>R'    ; (1/0)
  422. TOR:    JMP XTOR
  423.     HEAD 2,'R>'    ; (0/1)
  424. RFR:    JMP XRFR
  425.     HEAD 3,'2>R'    ; (2/0)
  426. TOR2:    JMP XTOR2
  427.     HEAD 3,'2R>'    ; (0/2)
  428. RFR2:    JMP XRFR2
  429.     HEAD 2,'to'    ; (1/0)
  430. TO:    JMP XTO
  431.     HEAD 3,'+to'    ; (1/0)
  432. PTO:    JMP XPTO
  433.     HEAD 3,'DUP'    ; (1/2)
  434. DUPE:    JMP XDUP
  435.     HEAD 4,'?DUP'    ; (1/2/0)
  436. QDUP:    JMP XQDUP
  437.     HEAD 4,'DROP'    ; (1/0)
  438. DROP:    JMP XDROP
  439.     HEAD 4,'SWAP'    ; (2/2)
  440. SWAP:    JMP XSWAP
  441.     HEAD 4,'OVER'    ; (2/3)
  442. OVER:    JMP XOVER
  443.     HEAD 3,'ROT'    ; (3/3)
  444. ROT:    JMP XROT
  445.     HEAD 2,'C@'    ; (1/1)
  446. CAT:    JMP XCAT
  447.     HEAD 2,'C!'    ; (2/0)
  448. CSTORE:    JMP XCSTORE
  449.     HEAD 4,'2DUP'    ; (2/4)
  450. DUP2:    JMP XDUP2
  451.     HEAD 5,'2DROP'    ; (2/0)
  452. DROP2:    JMP XDROP2
  453.     HEAD 5,'2SWAP'    ; (4/4)
  454. SWAP2:    JMP XSWAP2
  455.     HEAD 5,'2OVER'    ; (4/6)
  456. OVER2:    JMP XOVER2
  457.     HEAD 1,'+'    ; (2/1)
  458. PLUS:    JMP XPLUS
  459.     HEAD 1,'-'    ; (2/1)
  460. SUBT:    JMP XSUBT
  461.     HEAD 2,'0='    ; (1/1)
  462. ZEQ:    JMP XZEQ
  463.     HEAD 2,'0<'    ; (1/1)
  464. ZLESS:    JMP XZLESS
  465.     HEAD 2,'0>'    ; (1/1)
  466. ZGRT:    JMP XZGRT
  467.     HEAD 3,'0<>'    ; (1/1)
  468. ZNE:    JMP XZNE
  469.     HEAD 1,'='    ; (2/1)
  470. EQUAL:    JMP XEQUAL
  471.     HEAD 3,'0br'    ; (1/0)
  472. ZBRAN:    JMP XZBRAN
  473.     HEAD 2,'br'    ; (0/0)
  474. BRAN:    JMP XBRAN
  475.     HEAD 2,'lp'    ; (0/0)
  476. PLOOP:    JMP XPLOOP
  477.     HEAD 3,'+lp'    ; (1/0)
  478. PPLOOP: JMP XPPLOOP
  479.     HEAD 1,'I'    ; (0/1)
  480. I:    JMP XI
  481.     HEAD 2,'R@'    ; (0/1)
  482. RAT:    JMP XRAT
  483.     HEAD 2,'of'    ; (2/0/1)
  484. OF:    JMP XOF
  485.     HEAD 2,'1+'    ; (1/1)
  486. ONEPL:    JMP XONEPL
  487.     HEAD 2,'2+'    ; (1/1)
  488. TWOPL:    JMP XTWOPL
  489.     HEAD 2,'3+'    ; (1/1)
  490. THREEPL:JMP XTHREEPL
  491.     HEAD 2,'1-'    ; (1/1)
  492. ONEMI:    JMP XONEMI
  493.     HEAD 2,'2-'    ; (1/1)
  494. TWOMI:    JMP XTWOMI
  495.     HEAD 2,'3-'    ; (1/1)
  496. THREEMI:JMP XTHREEMI
  497.     HEAD 2,'2/'    ; (1/1)
  498. TWOSLS:    JMP XTWOSLS
  499.     HEAD 2,'2*'    ; (1/1)
  500. TWOSTAR:JMP XTWOSTAR
  501.     HEAD 3,'UM*'    ; (2/2)
  502. UMSTAR:    JMP XUMSTAR
  503.     HEAD 6,'UM/MOD'    ; (3/2)
  504. UMSLSM:    JMP XUMSLSM
  505.     HEAD 2,'D+'    ; (4/2)
  506. DPLUS:    JMP XDPLUS
  507.     HEAD 7,'DNEGATE'; (2/2)
  508. DNEGATE:JMP XDNEGATE
  509.     HEAD 6,'NEGATE'    ; (1/1)
  510. NEGATE:    JMP XNEGATE
  511.     HEAD 3,'AND'    ; (2/1)
  512. ANDD:    JMP XAND
  513.     HEAD 2,'OR'    ; (2/1)
  514. ORE:    JMP XORE
  515.     HEAD 3,'XOR'    ; (2/1)
  516. XORX:    JMP XXORX
  517.     HEAD 3,'LIT'    ; (1/0)
  518. LIT:    JMP XLIT
  519.     HEAD 2,'U<'    ; (2/1)
  520. ULESS:    JMP XULESS
  521.     HEAD 1,'<'    ; (2/1)
  522. LESS:    JMP XLESS
  523.     HEAD 2,'2@'    ; (1/2)
  524. TWOAT:    JMP XTWOAT
  525.     HEAD 2,'2!'    ; (3/0)
  526. TWOSTORE:JMP XTWOSTORE
  527.     HEAD 4,'PICK'    ; (1/1)
  528. PICK:    JMP XPICK
  529.     HEAD 2,'CR'    ; (0/0)
  530. CR:    JMP XCR
  531.     HEAD 4,'?KEY'    ; (0/1)
  532. QKEY:    JMP XQKEY
  533.     HEAD 3,'KEY'    ; (0/1)
  534. KEY:    JMP XKEY
  535.     HEAD 4,'EMIT'    ; (1/0)
  536. EMIT:    JMP XEMIT
  537.     HEAD 4,'TYPE'    ; (2/0)
  538. TYPEE:    JMP XTYPE
  539.     HEAD 2,'<>'    ; (2/1)
  540. NEQ:    COLON
  541.     DW EQUAL,ZEQ,EXIT
  542.  
  543.     HEAD 5,'CMOVE'
  544. CMOVE:    JMP LONG CM1    ; (3/0)
  545.     DW CM2
  546. CM1:    POP DI,AX
  547.     PUSH SI
  548.     MOV SI,AX
  549.     MOV CX,BX
  550.     JCXZ >L0
  551.     REP MOVSB
  552. L0:    POP SI,BX
  553.     NEXT
  554. CM2=$-CM1
  555.  
  556.     HEAD 1,'0'
  557. ZERO:    CONST        ; (0/1)
  558.     DW 0
  559.     HEAD 1,'1'
  560. ONE:    CONST        ; (0/1)
  561.     DW 1
  562.     HEAD 1,'2'
  563. TWO:    CONST        ; (0/1)
  564.     DW 2
  565.     HEAD 2,'-1'
  566. MIONE:    CONST        ; (0/1)
  567.     DW -1
  568.     HEAD 3,'$40'
  569. H40:    CONST        ; (0/1)
  570.     DW 040
  571.     HEAD 3,'$80'
  572. H80:    CONST        ; (0/1)
  573.     DW 080
  574.     HEAD 2,'1F'
  575. ONEF:    CONST        ; (0/1)
  576.     DW 01F
  577.     HEAD 2,'7F'
  578. SEVENF:    CONST        ; (0/1)
  579.     DW 07F
  580.     HEAD 2,'BL'
  581. BLANK:    CONST        ; (0/1)
  582.     DW 020
  583.     HEAD 4,'ROOT'
  584. ROOT:    CONST         ; (0/1)
  585.     DW RUTE
  586.     HEAD 7,'CURRENT'
  587. CURRENT:VARI        ; (0/1)
  588.     DW RUTE
  589.     HEAD 7,'CONTEXT'
  590. CONTEXT:VARI        ; (0/1)
  591. CONT    DW RUTE
  592.  
  593. ;    : LATEST CURRENT @ @ ;   (0/1)
  594.  
  595.     HEAD 6,'LATEST'
  596. LATEST:    COLON
  597.     DW CURRENT,ATT,ATT,EXIT
  598.  
  599. ;     : CLATEST CONTEXT @ @ ; (0/1)
  600.  
  601.     HEAD 7,'CLATEST'
  602. CLATEST:COLON
  603.     DW CONTEXT,ATT,ATT,EXIT
  604.  
  605. ;    : PATCH  1+ DUP >R 2+ - R> ! ;  (2/0)
  606.  
  607.     HEAD 5,'PATCH'
  608. PATCH:    COLON
  609.     DW ONEPL,DUPE,TOR,TWOPL,SUBT,RFR,STORE,EXIT
  610.  
  611.     HEAD 3,'>IN'
  612. TOIN:    TOVAR        ; (0/1)
  613.     DW OFFSET CTOIN
  614.     HEAD 4,'HERE'
  615. HERE:    TOVAR        ; (0/1)
  616.     DW OFFSET CHERE
  617.     HEAD 4,'SPAN'
  618. SPAN:    TOVAR        ; (0/1)
  619.     DW OFFSET CSPAN
  620.     HEAD 3,'BLK'
  621. BLK:    TOVAR        ; (0/1)
  622.     DW OFFSET CBLK
  623.     HEAD 5,'BLOCK'
  624. BLOCK:    TOVAR        ; (0/1)
  625.     DW OFFSET CBLOCK
  626.     HEAD 4,'BASE'
  627. BASE:    TOVAR        ; (0/1)
  628.     DW OFFSET CBASE
  629.     HEAD 9,'COMPILING'
  630. COMP:    TOVAR        ; (0/1)
  631.     DW OFFSET CCOMP
  632.     HEAD 3,'TDP'
  633. TDP:    TOVAR        ; (0/1)
  634.     DW OFFSET CTDP
  635.     HEAD 2,'R0'
  636. R0:    TOVAR        ; (0/1)
  637.     DW OFFSET CR0
  638.     HEAD 2,'S0'
  639. S0:    TOVAR        ; (0/1)
  640.     DW OFFSET CS0
  641.     HEAD 3,'DBL'
  642. DBL:    TOVAR        ; (0/1)
  643.     DW OFFSET CDBL
  644.  
  645.  
  646.     HEADI 1,'['    ; : [  0 TO COMPILING ; (0/0)
  647. LBRAK:    COLON
  648.     DW ZERO,TO,COMP,EXIT
  649.     HEAD 1,']'
  650. RBRAK:    COLON
  651.     DW MIONE,TO,COMP,EXIT
  652.     HEAD 5,'SPACE'    ; : BL EMIT ; (0/0)
  653. SPACE:    COLON
  654.     DW BLANK,EMIT,EXIT
  655.  
  656.     HEAD 5,'COUNT'    ; (1/2)
  657. COUNT:    JMP LONG COUNT1
  658.     DW COUNT2
  659. COUNT1:    MOV AX,BX
  660.     INC AX
  661.     PUSH AX
  662.     MOV BL,[BX]
  663.     MOV BH,0
  664.     NEXT
  665. COUNT2=$-COUNT1
  666.  
  667. ;    : .W   HERE COUNT 1F AND TYPE SPACE ; (0/0)
  668.  
  669.     HEAD 2,'.W'
  670. DOTW:    COLON
  671.     DW HERE,COUNT,ONEF,ANDD,TYPEE,SPACE,EXIT
  672.  
  673. ;    : LL  TDP 2- ;  (0/1)
  674.  
  675.     HEAD 2,'LL'
  676. LL:    COLON
  677.     DW TDP,TWOMI,EXIT
  678.  
  679. ;    : ?EX  LL @ = ;  (1/1)
  680.  
  681.     HEAD 3,'?EX'
  682. QEX:    COLON
  683.     DW LL,ATT,EQUAL,EXIT
  684.  
  685. ;     : ILT  R> COUNT 2DUP + >R TYPE ; (0/0)
  686.  
  687.     HEAD 3,'ILT'
  688. ILT:    COLON
  689.     DW RFR,COUNT,DUP2,PLUS,TOR,TYPEE,EXIT
  690.     HEAD 5,'ALLOT' ; : ALLOT +TO HERE ; (1/0)
  691. ALLOT:    COLON
  692.     DW PTO,HERE,EXIT
  693.     HEAD 1,','    ; : , HERE ! 2 ALLOT ;  (1/0)
  694. COMMA:    COLON
  695.     DW HERE,STORE,TWO,ALLOT,EXIT
  696.     HEAD 2,'C,'    ; : C, HERE C! 1 ALLOT ; (1/0)
  697. CCOMMA:    COLON
  698.     DW HERE,CSTORE,ONE,ALLOT,EXIT
  699.     HEAD 4,'!CSP'    ; (0/0)
  700. STCSP:    JMP LONG STCSP1
  701.     DW STCSP2
  702. STCSP1:    MOV AX,SP
  703.     MOV CSP,AX
  704.     NEXT
  705. STCSP2=$-STCSP1
  706.     HEAD 4,'CSP?'    ; RETURNS 'TRUE' IF CSP <> SP
  707. CSPQ:    JMP LONG CSPQ1    ; (0/1)
  708.     DW CSPQ2
  709. CSPQ1:    MOV AX,SP
  710.     PUSH BX
  711.     XOR BX,BX
  712.     CMP AX,CSP
  713.     JZ >L0
  714.     DEC BX
  715. L0:    NEXT
  716. CSPQ2=$-CSPQ1
  717.  
  718. ;  : ?CSP  CSP? ABORT" Unbalanced" ;  (0/0)
  719.  
  720.     HEAD 4,'?CSP'
  721. QCSP:    COLON
  722.     DW CSPQ,QER,
  723.     DB 11,' Unbalanced'
  724.     DW EXIT
  725.  
  726. ;      : :,  $E8 C, LIT DOCOLON HERE 2+ - , ; (0/0)
  727.  
  728.     HEAD 2,':,'
  729. COLCOM: COLON
  730.     DW LIT,0E8,CCOMMA,LIT,DOCOLON,HERE,TWOPL,SUBT,COMMA,EXIT
  731.  
  732. ;     : ?C  COMPILING 0=      (0/0)
  733. ;        IF 1 , HERE TO TDP :, !CSP ] THEN ;
  734.  
  735.     HEAD 2,'?C'
  736. QC:    COLON
  737.     DW COMP,ZEQ,ZBRAN,QC1,ONE,COMMA,HERE,TO,TDP,COLCOM,STCSP,RBRAK
  738. QC1:    DW EXIT
  739.  
  740. ;    : COMPILE  ?C R> DUP @ , 2+ >R ; (0/0)
  741.  
  742.     HEAD 7,'COMPILE'
  743. COMPILE:COLON
  744.     DW QC,RFR,DUPE,ATT,COMMA,TWOPL,TOR,EXIT
  745.  
  746.     HEAD 3,'CXR'    ; XOR CHAR AT ADDR WITH BYTE: (ADDR BYTE... )
  747. CXR:    JMP LONG CXR1    ; (2/0)
  748.     DW CXR2
  749. CXR1:    POP DI
  750.     XOR [DI],BL
  751.     POP BX
  752.     NEXT
  753. CXR2=$-CXR1
  754.     HEAD 3,'SP!'    ; (1/0)
  755. SPST:    JMP LONG SPST1
  756.     DW SPST2
  757. SPST1:  POP AX
  758.     MOV SP,BX
  759.     MOV BX,AX
  760.     NEXT
  761. SPST2=$-SPST1
  762.     HEAD 3,'RP!'    ; (1/0)
  763. RPST:    JMP LONG RPST1
  764.     DW RPST2
  765. RPST1:    MOV BP,BX
  766.     POP BX
  767.     NEXT
  768. RPST2=$-RPST1
  769.     HEAD 3,'CLR'
  770. CLR:    COLON        ;  : CLR  S0 SP! ; (0/0)
  771.     DW S0,SPST,EXIT
  772.     HEAD 7,'EXECUTE'
  773. EXECUTE:JMP XEXEC
  774.  
  775.     HEAD 5,'ERROR'
  776. ERROR:    DB 0E9        ; VECTORED ERROR HANDLER - PRESENTLY CLEARS STACK
  777.     DW CLR-($+2)
  778. ;     : HEX  16 TO BASE ;   (0/0)
  779.  
  780.     HEAD 3,'HEX'
  781. HEXX:    COLON
  782.     DW LIT,16,TO,BASE,EXIT
  783.  
  784. ;       : DECIMAL  10 TO BASE ;  (0/0)
  785.  
  786.     HEAD 7,'DECIMAL'
  787. DECIM:    COLON
  788.     DW LIT,10,TO,BASE,EXIT
  789.  
  790.  
  791. ;     : LITERAL  COMPILING         (1/0 COMPILING)
  792. ;    IF COMPILE LIT , THEN ;        (0/0 NON-COMPILING)
  793.  
  794.     HEADI 7,'LITERAL'
  795. LITERAL:COLON
  796.     DW COMP,ZBRAN,LI1,COMPILE,LIT,COMMA
  797. LI1:    DW EXIT
  798.  
  799. ;      : LINK LL CURRENT @ ! ;        (0/0)
  800.  
  801.     HEAD 4,'LINK'
  802. LYNK:    COLON
  803.     DW LL,CURRENT,ATT,STORE,EXIT
  804.  
  805. ;     : RID  LL TO HERE ;        (0/0)
  806.  
  807.     HEAD 3,'RID'
  808. RID:    COLON
  809.     DW LL,TO,HERE,EXIT
  810.  
  811.     HEAD 3,'0TO'    ;  RESET THE 'TO' FLAG TO ZERO (0/0)
  812. ZEROTO:    JMP LONG ZT1
  813.     DW ZT2
  814. ZT1:    MOV W TFL,0
  815.     NEXT
  816. ZT2=$-ZT1
  817.  
  818.  
  819.     HEAD 4,'find'        ;    (2/2)
  820. FINDE:    JMP LONG FIND1
  821.     DW FIND2
  822. FIND1:    POP DX            ; ADDRESS OF 'HERE'
  823.     PUSH SI            ; SAVE IP FOR LATER
  824. L0:    MOV BX,[BX]        ; START OF SEARCH
  825.     OR BX,BX        ; DONE IF LINK = 0
  826.     JZ >L2
  827.     MOV DI,DX        ; ADDR TO DI
  828.     MOV SI,BX        ; AND SI
  829.     ADD SI,2        ; STEP TO NAME FIELD
  830.     MOV CL,[SI]        ; NAME LENGTH
  831.     AND CX,01F        ; REDUCED TO 31 MAX BYTES
  832.     CMP CL,[DI]        ; LENGTHS MATCH?
  833.     JNZ L0            ; NO, GET NEXT NAME
  834.     INC SI            ; YES, STEP TO FIRST CHAR IN NAME
  835.     INC DI
  836.     REPZ CMPSB        ; COMPARE THEM
  837.     JNZ L0            ; NO MATCH - GO GET NEXT
  838.     POP CX            ; NAMES HIT! RESTORE SI
  839.     PUSH SI            ; SI = CODE ADDRESS OF WORD
  840.     MOV SI,CX        ; IP ONCE AGAIN = SI
  841.     TEST B[BX+2],040    ; CHACK FOR IMMEDIATE WORD
  842.     MOV BX,-1        ; TRUE FLAG BUT -1
  843.     JZ >L1
  844.     NEG BX            ; TRUE FLAG BUT +1 IF IMMEDIATE
  845. L1:    NEXT            ; ALL DONE
  846. L2:    POP SI            ; DID NOT FIND WORD SO RECOVER IP
  847.     PUSH DX            ; BX = 0 FOR FALSE FLAG, DX = 'HERE'
  848.     NEXT            ; AND WE'RE DONE
  849. FIND2=$-FIND1
  850.  
  851.     HEAD 2,'.H'    ; PRINT 4 DIGIT UNSIGNED HEX NUMBER AND SPACE
  852. DOTH:    MOV CX,4    ;  (1/0)
  853.     CALL PRH
  854.     POP BX
  855.     NEXT
  856.     HEAD 3,'.HC'    ; PRINT 2 DIGIT UNSGNED HEX NUMBER AND SPACE
  857. DOTHC:    MOV CX,2    ;  (1/0)
  858.     CALL PRH
  859.     POP BX
  860.     NEXT
  861. PRH:    MOV DI,CX
  862.     MOV AX,BX
  863.     MOV BX,16
  864. L0:    XOR DX,DX
  865.     DIV BX
  866.     XCHG AX,DX
  867.     ADD AL,090
  868.     DAA
  869.     ADC AL,040
  870.     DAA
  871.     PUSH AX
  872.     XCHG AX,DX
  873.     LOOP L0
  874.     MOV CX,DI
  875.     MOV AH,2
  876. L1:    POP DX
  877.     INT 021
  878.     LOOP L1
  879.     MOV DL,' '
  880.     INT 021
  881.     RET
  882.  
  883.     HEAD 5,'DEPTH'    ; RETURN STACK DEPTH   (0/1)
  884. DEPTH:    JMP LONG D1
  885.     DW D2
  886. D1:    PUSH BX
  887.     MOV BX,CS0
  888.     SUB BX,SP
  889.     SAR BX,1
  890.     DEC BX        ; ACCOUNT FOR NUMBER JUST PUSHED
  891.     NEXT
  892. D2=$-D1
  893.  
  894.     HEAD 4,'BDOS'    ; RUN DOS SERVICE $21
  895. BDOS:    JMP LONG BDOS1    ; ENTER WITH BX,CX,DX AND # ON STACK (4/1)
  896.     DW BDOS2    ; RETURNS FALSE IF NO ERROR - AX,BX,CX,DX
  897. BDOS1:    MOV AX,BX    ; FUNCTION IN AH
  898.     POP BX,CX,DX
  899.     INT 021
  900.     PUSH DX,CX,BX,AX
  901.     MOV BX,0
  902.     JNC >L0
  903.     DEC BX
  904. L0:    NEXT
  905. BDOS2=$-BDOS1
  906.  
  907.     HEAD 2,'DU'    ; CONVERT STRING AT ADDRESS TO AN (1/3)
  908. DU:    JMP LONG DU1    ; UNSIGNED DOUBLE NUMBER PLUS FLAG
  909.     DW DU2        ; TRUE IF SUCCESSFUL CONVERSION
  910. DU1:    MOV DI,BX
  911.     XOR AX,AX
  912.     MOV DX,AX    ; CLEAR DOUBLE ACCUMULATOR
  913.     MOV CDBL,AX    ; CLEAR DOUBLE PRECISION FLAG
  914.     MOV CX,CBASE    ; CX = NUMBER BASE
  915. L0:    MOV BL,[DI]    ; ASCII CHARACTER TO CONVERT
  916.     MOV BH,0
  917.     SUB BX,030    ; REMOVE ASCII BIAS
  918.     JB EX        ; DONE IF <0
  919.     CMP BX,10
  920.     JB >L1
  921.     SUB BX,7    ; -7 IF >= 10
  922.     CMP BX,10
  923.     JB EX        ; DONE IF < 10
  924. L1:    CMP BX,CX
  925.     JNB EX        ; DONE IF >= BASE
  926.     PUSH BX        ; SAVE NUMBER
  927.     PUSH DX        ; AND MSH OF PRODUCT
  928.     MUL CX
  929.     MOV BX,AX    ; SAVE LSH OF PRODUCT
  930.     POP AX        ; RECOVER MSH OF PRODUCT
  931.     PUSH DX        ; SAVE OVERFLOW
  932.     MUL CX
  933.     POP DX
  934.     ADD DX,AX    ; ADD OVERFLOW TO MSH
  935.     MOV AX,BX    ; RECOVER LSH
  936.     POP BX        ; AND NUMBER
  937.     ADD AX,BX    ; ADD IT IN  16-BIT TO 32-BIT ADD
  938.     ADC DX,0
  939.     INC DI
  940.     JMP L0
  941. EX:    PUSH AX,DX    ; SAVE DOUBLE NUMBER
  942.     MOV BX,-1    ; TRUE FLAG
  943.     CMP B[DI],'.'
  944.     JNZ >L2
  945.     MOV CDBL,BX    ; DOUBLE PRECISION IF DELIMITER IS A PERIOD
  946.     INC DI
  947. L2:    CMP B[DI],' '    ; MUST BE A SPACE FOR VALID NUMBER
  948.     JZ >L3        ; OK
  949.     INC BX        ; FALSE FLAG
  950. L3:    NEXT
  951. DU2=$-DU1
  952.  
  953. ;    : DS COUNT ASCII - = DUP >R 0= + DU    ( 1/3)
  954. ;    IF R>  IF DENEGATE -1 THEN
  955. ;    ELSE R> DROP 0
  956. ;    THEN ;
  957.  
  958.     HEAD 2,'DS'
  959. DS0:    COLON
  960.     DW COUNT,LIT,02D,EQUAL,DUPE,TOR,ZEQ,PLUS,DU,ZBRAN,DS1
  961.     DW RFR,ZBRAN,DS2,DNEGATE
  962. DS2:    DW MIONE,BRAN,DS3
  963. DS1:    DW RFR,DROP,ZERO
  964. DS3:    DW EXIT
  965.  
  966. ;     : $DS BASE >R COUNT ASCII $ = DUP        ( 1/3)
  967. ;    IF HEX THEN 0= + DS R> TO BASE ;
  968.  
  969.     HEAD 3,'$DS'
  970. HDS:    COLON
  971.     DW BASE,TOR,COUNT,LIT,024,EQUAL,DUPE,ZBRAN,HDS1,HEXX
  972. HDS1:    DW ZEQ,PLUS,DS0,RFR,TO,BASE,EXIT
  973.  
  974.     HEAD 2,'NU'    ; VECTORED WORD FOR 'NUMBER' INITIALIZED 
  975. NU:    DB 0E9
  976.     DW HDS-($+2)    ; TO POINT TO '$DS' FOR HEX ENTRY
  977.     HEAD 2,'??'
  978. QQ:    COLON        ;    : ??  0= IF .W  -1  ABORT" ?" ;  ( 1/0)
  979.     DW ZEQ,ZBRAN,QQ1,DOTW,MIONE,QER
  980.     DB 2,' ?'
  981. QQ1:    DW EXIT
  982.  
  983. ;    : ?NU   NU  ?? ;        ( 1/3/0)
  984.  
  985.     HEAD 3,'?NU'
  986. QNU:    COLON
  987.     DW NU,QQ,EXIT
  988.  
  989.      HEAD 3,'KBD'    ; ACCEPT UP TO 80 CHARACTERS FROM THE KEYBOARD
  990. KBD:    JMP LONG KBD1    ; SPAN HOLDS THE ACTUAL COUNT OF KEYSTROKES
  991.     DW KBD2        ;  ( 0/0)
  992. KBD1:    MOV DX,BUF
  993.     MOV AH,10
  994.     INT 021
  995.     MOV AL,CNT B
  996.     CBW
  997.     MOV CSPAN,AX
  998.     NEXT
  999. KBD2=$-KBD1
  1000.  
  1001. ;     : RF ROOT find ;     ( 1/2)
  1002.  
  1003.     HEAD 2,'RF'
  1004. RF:    COLON
  1005.     DW ROOT,FINDE,EXIT
  1006.     HEAD 4,'FIND'
  1007. FIND:    DB 0E9        ; 'FIND' VECTORED TO 'RF' INITIALLY
  1008.     DW RF-($+2)
  1009.  
  1010. ;     (1/1) FOR WORD
  1011.  
  1012.     HEAD 4,'WORD'    ; GET NEXT WORD FROM INPUT TO 'HERE'. LEAVE
  1013. XWORD:    JMP LONG WORD1    ; 'HERE' ON STACK. ALSO ACCEPTS TAB, CR, AND LF
  1014.     DW WORD2    ; AS ABSOLUTE DELIMITERS IN ADDITION TO CHAR ON STK
  1015. WORD1:    MOV AH,9    ; TAB CHARACTER
  1016.     MOV DX,0D0A    ; CR AND LF CHARACTERS
  1017.     MOV AL,BL    ; SCAN CHARACTER
  1018.     MOV BX,BUF+2    ; START OF KEYBOARD BUFFER
  1019.     MOV CX,CBLK W    ; 0 IF KEYBOARD
  1020.     JCXZ >L0
  1021.     MOV BX,CBLOCK    ; ELSE GET BLOCK ADDRESS
  1022.     XOR CX,CX    ; AND SET CX COUNT TO 0
  1023. L0:    ADD BX,CTOIN    ; OFFSET INTO BUFFER
  1024.     JMP >L1
  1025. L2:    INC CX
  1026.     INC BX
  1027. L1:    CMP [BX],AL
  1028.     JZ L2
  1029.     CMP [BX],AH
  1030.     JZ L2
  1031.     CMP [BX],DL
  1032.     JZ L2
  1033.     CMP [BX],DH
  1034.     JZ L2        ; SKIP BUT COUNT LEADING CHARS
  1035.     PUSH SI        ; SAVE THE IP
  1036.     MOV SI,BX    ; SI -> FIRST CHAR OF WORD
  1037.     JMP >L0
  1038. L1:    INC CX
  1039.     INC BX
  1040. L0:    CMP [BX],AH
  1041.     JZ >L3
  1042.     CMP [BX],DL
  1043.     JZ >L3
  1044.     CMP [BX],DH
  1045.     JZ >L3
  1046.     CMP [BX],AL
  1047.     JNZ L1        ; SCAN FOR DELIMITER
  1048. L3:    INC CX        ; STEP PAST DELIMITER
  1049.     ADD CTOIN,CX    ; ADVANCE >IN BY CX
  1050.     SUB BX,SI    ; ACTUAL COUNT OF WORD
  1051.     MOV CX,BX    ; INTO CX
  1052.     MOV DI,CHERE    ; MOVE TO HERE
  1053.     MOV BX,DI    ; TOS ALSO = HERE ON EXIT
  1054.     MOV AL,CL    ; WORD LENGTH
  1055.     STOSB
  1056.     REP MOVSB    ; AND STRING MOVED TO HERE
  1057.     MOV AL,' '    ; FOLLOWED BY A SPACE
  1058.     STOSB
  1059.     POP SI        ; RESTORE THE IP
  1060.     NEXT
  1061. WORD2=$-WORD1
  1062.  
  1063. ;    : W,  WORD C@ 1+ ALLOT ;  (1/0)
  1064.  
  1065.     HEAD 2,'W,'
  1066. WCOMMA:    COLON
  1067.     DW XWORD,CAT,ONEPL,ALLOT,EXIT
  1068.  
  1069. ;    : HEAD  LATEST , HERE TO TDP BL W, TDP $80 CXR ; (0/0)
  1070.  
  1071.     HEAD 4,'HEAD'
  1072. HED:    COLON
  1073.     DW LATEST,COMMA,HERE,TO,TDP,BLANK,WCOMMA
  1074.     DW TDP,H80,CXR,EXIT
  1075.  
  1076. ;      : CREATE  HEAD $E9 C, LIT DOVAR HERE 2+ - , ; (0/0)
  1077.  
  1078.     HEAD 6,'CREATE'
  1079. VCREATE:COLON
  1080.     DW HED,LIT,0E9,CCOMMA,LIT,DOVAR,HERE,TWOPL,SUBT,COMMA,EXIT
  1081.  
  1082.  
  1083. ;     :  :  HEAD :, !CSP ] ;  (0/0)
  1084.  
  1085.     HEAD 1,':'
  1086. COLN:    COLON
  1087.     DW HED,COLCOM,STCSP,RBRAK,EXIT
  1088.  
  1089. ;   :  ;  IMMEDIATE ?CSP COMPILE EXIT 1 ?EX  (0/0)
  1090. ;        IF 2 LL !
  1091. ;        ELSE LINK
  1092. ;        THEN [ ;
  1093.  
  1094.     HEADI 1,';'
  1095. SEMI:    COLON
  1096.     DW QCSP,COMPILE,EXIT,ONE,QEX,ZBRAN,SE1,TWO,LL,STORE,BRAN,SE2
  1097. SE1:    DW LYNK
  1098. SE2:    DW LBRAK,EXIT
  1099.  
  1100. ;   : LOCATE  BL WORD FIND ;   (0/2)
  1101.  
  1102.     HEAD 6,'LOCATE'
  1103. LOCATE:    COLON
  1104.     DW BLANK,XWORD,FIND,EXIT
  1105.  
  1106. ;    : NUMBER  1+ ?NU COMPILING        ( 1/0 COMPILING)
  1107. ;    IF DBL    IF SWAP LITERAL LITERAL ( 1/1 NON-COMPILING)
  1108. ;        ELSE DROP LITERAL
  1109. ;        THEN
  1110. ;    ELSE DBL 0= IF DROP THEN
  1111. ;    THEN ;
  1112.  
  1113.     HEAD 6,'NUMBER'
  1114. NUMB:    COLON
  1115.     DW ONEPL,QNU,COMP,ZBRAN,NN1,DBL,ZBRAN,NN2,SWAP
  1116.     DW LITERAL,LITERAL,BRAN,NN4
  1117. NN2:    DW DROP,LITERAL,BRAN,NN4
  1118. NN1:    DW DBL,ZEQ,ZBRAN,NN4,DROP
  1119. NN4:    DW EXIT
  1120.  
  1121. ;      : BYE   0 EXECUTE ; (0/0)
  1122.  
  1123.     HEAD 3,'BYE'
  1124. BYE:    COLON
  1125.     DW ZERO,EXECUTE,EXIT
  1126.  
  1127. ;   : INTERPRET COMPILING    (1/0)
  1128. ;    IF 1+     IF EXECUTE
  1129. ;        ELSE ,
  1130. ;        THEN
  1131. ;    ELSE DROP EXECUTE
  1132. ;    THEN ;
  1133.  
  1134.     HEAD 9,'INTERPRET'
  1135. INTERP:    COLON
  1136.     DW COMP,ZBRAN,IN1,ONEPL,ZBRAN,IN2,EXECUTE,BRAN,IN3
  1137. IN2:    DW COMMA
  1138. IN3:    DW BRAN,IN4
  1139. IN1:    DW DROP,EXECUTE
  1140. IN4:    DW EXIT
  1141.  
  1142. ;    : RUN     CR BEGIN >IN SPAN <    ( 0/0)
  1143. ;           WHILE 0TO LOCATE ?DUP
  1144. ;            IF INTERPRET
  1145. ;            ELSE NUMBER
  1146. ;            THEN DEPTH 0< $80 DEPTH < OR ABORT" Stack?"
  1147. ;           REPEAT    
  1148. ;           2 ?EX     IF TDP EXECUTE RID [ THEN ;
  1149.  
  1150.     HEAD 3,'RUN'
  1151. RUN:    COLON
  1152.     DW CR
  1153. RU1:    DW TOIN,SPAN,LESS,ZBRAN,RU4,ZEROTO,LOCATE,QDUP,ZBRAN,RU3
  1154.     DW INTERP,BRAN,RU2
  1155. RU3:    DW NUMB
  1156. RU2:    DW DEPTH,ZLESS,H80,DEPTH,LESS,ORE,QER
  1157.     DB 7,' Stack?'
  1158.     DW BRAN,RU1
  1159. RU4:    DW TWO,QEX,ZBRAN,RU5,TDP,EXECUTE,RID,LBRAK
  1160. RU5:    DW EXIT
  1161.  
  1162. ;    : QUIT R0 RP! [            ( 0/0)
  1163. ;    BEGIN CR 0 TO BLK KBD 0 TO >IN RUN
  1164. ;       COMPILING 0= IF ." ok" THEN
  1165. ;    AGAIN ;
  1166.  
  1167.     HEAD 4,'QUIT'
  1168. QUIT:    COLON
  1169.     DW R0,RPST,LBRAK
  1170. QUI:    DW CR,ZERO,TO,BLK,KBD,ZERO,TO,TOIN,RUN,COMP,ZEQ
  1171.     DW ZBRAN,QU1,ILT
  1172.     DB 3,' ok'
  1173. QU1:    DW BRAN,QUI,EXIT
  1174.  
  1175. ;   : ?ER 0TO            (1/0)
  1176. ;    IF COMPILING IF RID THEN
  1177. ;      R> COUNT TYPE ERROR QUIT
  1178. ;    ELSE R> COUNT + >R
  1179. ;    THEN ;
  1180.  
  1181.     HEAD 3,'?ER'
  1182. QER:    COLON
  1183.     DW ZEROTO,ZBRAN,QER3,COMP,ZBRAN,QER2,RID
  1184. QER2:    DW RFR,COUNT,TYPEE,ERROR,QUIT,BRAN,QER1
  1185. QER3:    DW RFR,COUNT,PLUS,TOR
  1186. QER1:    DW EXIT
  1187.  
  1188. ;    : ABORT  [ -1 ABORT" MINIFORTH V1.0 - 8/8/88" ; (0/0)
  1189.  
  1190. LAST:    HEAD 5,'ABORT'
  1191. ABORT:    COLON
  1192.     DW LBRAK,MIONE,QER
  1193.     DB CT
  1194. CT1:    DB 'MINIFORTH V1.0 - 8/8/88'
  1195. CT=$-CT1
  1196.     DW EXIT
  1197.  
  1198.  
  1199. INIT:    CLD
  1200.     XOR AX,AX
  1201.     MOV BX,AX
  1202.     MOV CR0,AX
  1203.     MOV BP,AX
  1204.     SUB AX,256
  1205.     MOV CS0,AX
  1206.     MOV SP,AX
  1207.     MOV AX,10
  1208.     MOV CBASE,AX
  1209.     MOV CCOMP,BX
  1210.     MOV SI,ABORT+3
  1211.     NEXT
  1212. DP=$
  1213.